package com.struggle.myrabbitmq.sample.subscribe;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.struggle.myrabbitmq.sample.MyRabbitConstants;
import com.struggle.myrabbitmq.util.ConnectionUtil;

/**
 * @className Send
 * @Description 订阅模式：消息发送，消息先发送到交换机，注意消息发送到没有队列绑定的交换机时，消息将丢失，交换机没有存储消息的能力
 * @Author liuwj3
 * @Date 2019/9/30 0030 下午 4:26
 **/
public class Send {
    /**
     * 1.Fanout Exchange – 不处理路由键。
     * 你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
     * 很像子网广播，每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
     * 任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上
     *
     * 2.这种模式不需要RouteKey
     *
     * 3.这种模式需要提前将Exchange与Queue进行绑定，一个Exchange可以绑定多个Queue，一个Queue可以同多个Exchange进行绑定。
     *
     * 4.如果接受到消息的Exchange没有与任何Queue绑定，则消息会被抛弃。
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 声明交换机：订阅模式
        channel.exchangeDeclare(MyRabbitConstants.EXCHANGE_NAME_FANOUT, BuiltinExchangeType.FANOUT);

        String message = "hello,this is public/subscribe, from exchange";
        channel.basicPublish(MyRabbitConstants.EXCHANGE_NAME_FANOUT, "", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");

        channel.close();
        connection.close();
    }

}
